iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0

今日目標

  • 安裝GLAD
  • 畫出第一個三角形

GLAD

還記得以前大學的時候,課堂上使用的是glut,當時很多地方都不清楚,只依稀記得底層是調用OpenGL 1.1的API,也就是固定管線(Fixed Function),簡言之,就是不能由開發者自己去編寫Shader,控制GPU要怎麼畫。可編程管線沒記錯是在3.0伴隨著GLSL 1.0才開始的。

可編程管線的版本的OpenGL,網路上最常看到的是用glew或是glad,雖說最開始用的是glew,但就跟所有C與C++的lib一樣,對於初學,會需要一些linker、靜態和動態函式庫的知識,才可以正常的開始使用,用起來感覺很差,於是選用glad,直接產一個header跟source,直接加入專案就好了,怎麼編譯都行!

其實還有另一個原因是,自學一些OpenGL時的教材是使用glad,這個是連結

這個是我找到的簡中翻譯版本

事實上GLAD不是OpenGL的函式庫,比較像是產生器,選擇你要的OpenGL規格,然後產出文件。官方github就有提供連結,但我在這裡要使用的是更下面的glad2,他會產出single-header file,如名,他只會有一個header,不會有另外一份放"實作(implementaion)"的*.c文件。

點進這個連結後:
請在gl那邊選OpenGL的版本,我這裡用的是GL3.3,最後下面點選header only,最後按下Generate。把.zip下載下來,把gl.h放到專案的exteranl裡面,就完成一半了,我是在開一個glad資料夾把gl.h放在裡面。

再來就是驗證,有沒有安裝成功了,我們要再次請出glfw的範例。

在Game Loop中一行:

/* Render here */
glClear(GL_COLOR_BUFFER_BIT);

這個是清除這個frame的color buffer,gl開頭的就是調用OpenGL的函式,為求方便驗證,再加上一行:

// 參數是浮點數,需要將RGBA的色碼轉換 [RGBA] / 255.0
glClearColor(r, g, b, a);

清除後,會換上新的背景顏色。

對了,就重要的是,要初始化GLAD
可以在iron_window.c的地方加入#include "glad.h",然後在include之前#define GLAD_GL_IMPLEMENTATION,像這樣:

#define GLAD_GL_IMPLEMENTATION
#include "glad.h"

然後在CreateWindow那裏加上

// Init glad
if (!gladLoadGL(glfwGetProcAddress)) {
    printf("Failed to load glad.");
    return RES_ERROR_LOAD_GLAD;
}

就可以開始使用OpenGL的API了。

這個define是哪來的,各位可以打開gl.h的第4040行,就可以看到single-header file,其實就是把實作放到header裡,然後用預處理器的指令把實作跟宣告隔開。

如果對single-header file有更多興趣的話,可以參考這位大大的github,FAQ那裏有更多說明,但是只有英文的。(>~<)

注意: GLFW裡面有個坑

然後最後再按下按鈕就可以有一個你喜歡顏色的視窗對不對!

錯!!

在編譯到最後的時候,我的compiler顯示引用錯誤,看來專案其他地方也有實作了OpenGL。

把矛頭看相最可疑的glfw,在glfw/deps/glad下找到了,glfw也有引用glad,於是在查找官方文件後(找很久),找到了這一段,可以把glfwglad停用,改用我們自己的,最後在include的地方(一樣是iron_window.c)變成這樣...

#define GLFW_INCLUDE_NONE
#include "GLFW/glfw3.h"

#define GLAD_GL_IMPLEMENTATION
#include "glad/gl.h"

小目標失敗 - 畫出第一個三角形

原本今天(2021/09/13)預計要畫出第一個三角形,結果卡在GLFW那個坑上面,但這也很貼近程式設計師的的日常工作會發生的事,計畫敢不上變化,原本預計花N個小時解決這個問題,結果衍生處更多問題 (QAQ)。

已經有預感會有更多坑惹,不然怎麼叫挑戰呢。(ˊ_>ˋ)

參考

最後,這是專案連結


上一篇
[Day2] 命名規則與組織寫好的功能
下一篇
[Day4] 第一個矩形
系列文
翻車機率極高的2D平台遊戲(2D Platformer)製作33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言